package lucava.metamodel.java;

import lucava.metamodel.java.type.MetaType;
import lucava.metamodel.java.visitor.IJavaMetaModelVisitor;

public class Attribute extends Declaration implements IVisibleEntity {

	/**
	 * Valeur par défault de l'attribut.
	 */
	protected Object mDefaultValue;

	/**
	 * Visibilité de l'attribut.
	 */
	protected final Visibility mVisibility = new Visibility();

	/**
	 * Cadinalité de l'attribut.
	 */
	protected String mCardinality;

	/**
	 * Constructeur.
	 * 
	 * @param aType
	 *            , Type de l'attribut.
	 * @param aName
	 *            , Nom de l'attribut.
	 */
	public Attribute(MetaType aType, String aName) {
		this(aType, aName, "1");
	}

	/**
	 * Constructeur.
	 * 
	 * @param aType
	 *            , Type de l'attribut.
	 * @param aName
	 *            , Nom de l'attribut.
	 * @param aCardinality
	 *            , Cardinalité de l'attribut.
	 */
	public Attribute(MetaType aType, String aName, String aCardinality) {
		super(aType, aName);
		this.mCardinality = aCardinality;
	}

	/**
	 * Méthode d'acceptation du visiteur de MetaModelJava.
	 * 
	 * @param aVisitor
	 *            , Visiteur de MetaModelJava.
	 */
	public void accept(IJavaMetaModelVisitor aVisitor) {
		aVisitor.visitAttribute(this);
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#setPrivate()
	 */
	@Override
	public void setPrivate() {
		this.mVisibility.setPrivate();
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#setProtected()
	 */
	@Override
	public void setProtected() {
		this.mVisibility.setProtected();
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#setPublic()
	 */
	@Override
	public void setPublic() {
		this.mVisibility.setPublic();
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#getVisibility()
	 */
	@Override
	public Visibility getVisibility() {
		return mVisibility;
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#isPrivate()
	 */
	@Override
	public boolean isPrivate() {
		return this.mVisibility.isPrivate();
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#isProtected()
	 */
	@Override
	public boolean isProtected() {
		return this.mVisibility.isProtected();
	}

	/**
	 * Suivre le lien.
	 * 
	 * @see lucava.metamodel.java.IVisibleEntity#isPublic()
	 */
	@Override
	public boolean isPublic() {
		return this.mVisibility.isPublic();
	}

	/**
	 * Retourne la valeur par défaut de l'attribut.
	 */
	public Object getDefaultValue() {
		return mDefaultValue;
	}

	/**
	 * Assigne la valeur par défaut de l'attribut.
	 * 
	 * @param aDefaultValue
	 *            , Valeur par défaut.
	 */
	public void setDefaultValue(Object aDefaultValue) {
		this.mDefaultValue = aDefaultValue;
	}

	/**
	 * Booléen indiquant si la cardinalité de l'attribut est multiple.
	 */
	public boolean isMultiple() {
		return !this.mCardinality.equals("1");
	}
}
